package com.daji.concurrency.multithread_synchronized;

/*
    运行下面的代码，有一定概率发生死锁

    死锁发生后，没有任何机制能解除死锁，只能强制结束JVM进程。
    因此，在编写多线程应用时，要特别注意防止死锁。因为死锁一旦形成，就只能强制结束进程。
* */
public class B05_DeadLock {
    public static void main(String[] args) throws InterruptedException {
        //思考：这里的t1和t2里面都是new出来的DeadLockTest的两个新的对象，为什么仍然还是同步的呢？
        //原因是锁的名字 同样是 lockA 和 lockB。锁的名字相同！所以是同一把锁
        DeadLockTest deadLockTest = new DeadLockTest();
        Thread t1 = new Thread(()->{
            new DeadLockTest().add();
            //deadLockTest.add();
        });
        Thread t2 = new Thread(()->{
            new DeadLockTest().dec();
            //deadLockTest.dec();
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

class DeadLockTest {
    public void add() {
        synchronized ("lockA") { // 获得lockA的锁
            System.out.println("add 已经获得A锁");
            synchronized ("lockB") { // 获得lockB的锁
                System.out.println("add 已经获得B锁");
            } // 释放lockB的锁
        } // 释放lockA的锁
    }

    public void dec() {
        synchronized ("lockB") { // 获得lockB的锁
            System.out.println("dec 已经获得B锁");
            synchronized ("lockA") { // 获得lockA的锁
                System.out.println("dec 已经获得A锁");
            } // 释放lockA的锁
        } // 释放lockB的锁
    }
}
